package cmd

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"os"
	"os/exec"
	"path/filepath"
)

func ExecKubectlCmd(cmdStr string) (msg string, err error) {
	cmd := exec.Command("bash", "-c", cmdStr)
	output, err := cmd.CombinedOutput()
	if err != nil {
		return msg, fmt.Errorf("failed to execute command: %v, output: %s", err, output)
	}
	return string(output),err
}

func GetKubectlCfg(){
	// 加载 KUBECONFIG 文件
	kubeconfigBytes, err := os.ReadFile("kubeconfig")
	if err != nil {
		log.Fatalf("无法读取 KUBECONFIG 文件: %v", err)
	}

	// 加密 KUBECONFIG 文件内容
	password := []byte("your-password") // 替换为自己的密码
	cipherText, err := ChaChaEncrypt(password, kubeconfigBytes)
	if err != nil {
		log.Fatalf("加密失败: %v", err)
	}

	// 连接到数据库
    db, err := sql.Open("mysql", "root:xdb5vRs2@tcp(192.168.10.209:3306)/kubeconfig_test")
	if err != nil {
		log.Fatalf("连接到 MySQL 失败: %v", err)
	}
	defer db.Close()

	// 创建表格
	_, err = db.Exec("CREATE TABLE IF NOT EXISTS configs (id INT AUTO_INCREMENT PRIMARY KEY, kubeconfig BLOB)")
	if err != nil {
		log.Fatalf("创建表格失败: %v", err)
	}

	// 将加密的 kubeconfig 写入数据库
	_, err = db.Exec("INSERT INTO configs (kubeconfig) VALUES (?)", cipherText)
	if err != nil {
		log.Fatalf("插入数据失败: %v", err)
	}

	// 从数据库中获取加密的 kubeconfig
	var encryptedKubeconfig []byte
	err = db.QueryRow("SELECT kubeconfig FROM configs LIMIT 1").Scan(&encryptedKubeconfig)
	if err != nil {
		log.Fatalf("从数据库中获取 kubeconfig 失败: %v", err)
	}

	// 解密 kubeconfig
	plainTextKubeconfig, err := ChaChaDecrypt(password, encryptedKubeconfig)
	if err != nil {
		log.Fatalf("解密 kubeconfig 失败: %v", err)
	}

	// 将解密后的 kubeconfig写入临时文件
	tempDir := os.TempDir()
	tempFile := filepath.Join(tempDir, "kubeconfig")
	err = os.WriteFile(tempFile, plainTextKubeconfig, 0600)
	if err != nil {
		log.Fatalf("无法写入 kubeconfig 至临时文件: %v", err)
	}
	defer os.Remove(tempFile)

	// 设置 KUBECONFIG 环境变量为临时文件路径
	err = os.Setenv("KUBECONFIG", tempFile)
	if err != nil {
		log.Fatalf("设置 KUBECONFIG 环境变量失败: %v", err)
	}

	// 执行 kubectl 命令
	command := exec.Command("kubectl", "get", "ns")
	output, err := command.CombinedOutput()
	if err != nil {
		log.Fatalf("执行 kubectl 命令失败: %v", err)
	}

	fmt.Println(string(output))

}